#include <stdio.h>     //标准输入输出
#include <unistd.h>
#include "ohos_init.h" //用于初始化服务和功能
#include "cmsis_os2.h" //CMSIS-RTOS API V2

#include "iot_gpio.h"
#include "hi_gpio.h"
// 海思SDK接口：IoT硬件设备操作接口-IO
// 海思SDK接口，以hi_io_set_func(...)
#include "hi_io.h"

// 定义GPIO引脚
#define SCK_GPIO 0
#define DOUT_GPIO 1

#define GapValue 305
// float Weight=0;
uint32_t Weight_Maopi = 0;
uint32_t HX711_Buffer = 0;
int32_t Weight_Shiwu = 0;


uint32_t Hx711_Read(void)
{
    unsigned long count;
    unsigned char i;
    IotGpioValue value = IOT_GPIO_VALUE0;
    IoTGpioGetInputVal(DOUT_GPIO, &value);
    osDelay(0.001);
    IoTGpioSetOutputVal(SCK_GPIO, IOT_GPIO_VALUE0); // 输出高电平
    osDelay(0.001);
    count = 0;
    // 获取GPIO5引脚的输入电平（1高电平，0低电平）
    // 调用IoTGpioGetInputVal接口
    do
    {
        IoTGpioGetInputVal(DOUT_GPIO, &value);
    } while (value);
    for (i = 0; i < 24; i++)
    {
        // IoTGpioSetOutputVal(SCK_GPIO, i%2?IOT_GPIO_VALUE1:IOT_GPIO_VALUE0); // 状态验证
        IoTGpioSetOutputVal(SCK_GPIO, IOT_GPIO_VALUE1); // 输出高电平
        osDelay(0.001);
        count = count << 1;                             // 左移一位
        IoTGpioSetOutputVal(SCK_GPIO, IOT_GPIO_VALUE0); // 输出低电平
        osDelay(0.001);
        IoTGpioGetInputVal(DOUT_GPIO, &value);
        // printf("%d", value);
        if (value)
        {
            count++;
        }
    }
    IoTGpioSetOutputVal(SCK_GPIO, IOT_GPIO_VALUE1);
    count = count ^ 0x800000;
    osDelay(0.001);
    IoTGpioSetOutputVal(SCK_GPIO, IOT_GPIO_VALUE0);
    osDelay(0.001);
    return count;
}

int32_t Get_Weight(void)
{
    HX711_Buffer = Hx711_Read();
    if(HX711_Buffer > Weight_Maopi)
    {
    Weight_Shiwu = HX711_Buffer;
    Weight_Shiwu = Weight_Shiwu - Weight_Maopi;               // 获取实物的AD采样数值。
    Weight_Shiwu = (int32_t)((float)Weight_Shiwu / GapValue); // 计算实物的实际重量
                                                                  // 因为不同的传感器特性曲线不一样，因此，每一个传感器需要矫正这里的GapValue这个除数。
                                                                  // 当发现测试出来的重量偏大时，增加该数值。

        // Weight_Shiwu=KLM(Weight_Shiwu);																		//如果测试出来的重量偏小时，减小改数值。
    }
    return Weight_Shiwu;
}

static void Hx711Task(void *arg)
{
    (void)arg;
    // 初始化GPIO模块
    IoTGpioInit(SCK_GPIO);
    IoTGpioInit(DOUT_GPIO);

    // 设置GPIO0为GPIO功能
    hi_io_set_func(SCK_GPIO, HI_IO_FUNC_GPIO_0_GPIO);

    // 设置GPIO0为输出模式
    IoTGpioSetDir(SCK_GPIO, IOT_GPIO_DIR_OUT);

    // 设置GPIO1为GPIO功能
    hi_io_set_func(DOUT_GPIO, HI_IO_FUNC_GPIO_1_GPIO);

    // 设置GPIO1为输入模式
    IoTGpioSetDir(DOUT_GPIO, IOT_GPIO_DIR_IN);


    Weight_Maopi = Hx711_Read();
    osDelay(200);
    while (1)
    {

        Get_Weight();
            printf("净重量 = %d g\r\n", Weight_Shiwu); // 打印
        osDelay(100);
    }
}

static void Hx711Entry(void)
{
    osThreadAttr_t attr;
    attr.name = "Hx711Task";
    attr.attr_bits=0U;
    attr.cb_mem=NULL;
    attr.cb_size=0U;
    attr.stack_mem=NULL;
    attr.stack_size = 10240;
    attr.priority = osPriorityNormal;
    if (osThreadNew(Hx711Task, NULL, &attr) == NULL)
    {
        printf("[Hx711Demo] Create LedTask failed!\n");
    }
}
// 运行入口函数
SYS_RUN(Hx711Entry);
